package com.neuedu.spring.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 项目：spring-java4
 * 创建时间：  2022-03-21   10:34
 * 作者 :jshand
 * 描述 :
 */
@Component
@Aspect
public class TransactionAdvice {

    @Pointcut("execution(* com.neuedu.spring.service.*.save*(..))")
    public void pointCut1(){}



    //想要在所有Service方法执行之前调用
    @Before("pointCut1()")
    public void openTransaction(){
        System.out.println("start 开启事务");
    }

    //想要在所有Service方法执行完调用
    @AfterReturning("pointCut1()")
    public void commit(){
        System.out.println("提交事务");
    }

    @After("pointCut1()")
    public void closeSession(){
        System.out.println("关闭sesion");
    }

    @AfterThrowing(value="pointCut1()" ,throwing="exception")
    public void rollback(Exception exception){
        //可以针对ex操作 ，保存一个数据库记录
        System.out.println("回滚事务");
    }

//    @Around("pointCut1()")
    public void around(ProceedingJoinPoint pjp){
        //之前
        //save 切点
        System.out.println("around    start ...........");
        try {
            pjp.proceed();  //save方法
            System.out.println("正常执行");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("异常的处理");
        }
        System.out.println("around    end ...........");
        //之后
    }
}
